#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

#include <task.h>
#include <serial.h>
#include <gpio.h>

/*
 *  函数名：parse_command
 *  功能说明：解析并执行接收到的命令
 *  参数：command - 待解析的命令字符串
 *  返回值：void
 *  日期：2025年3月
 */
void parse_command(const char *command)
{
    char *token;
    char *savestr;
    char cmd_copy[BUF_SIZE];
    char *args[4] = {"default", NULL, NULL, NULL}; //必须以NULL为最后一个参数
    pid_t parent_pid;
    
    
    /* 复制命令，用于解析 */
    strncpy(cmd_copy, command, sizeof(cmd_copy) - 1);
    token = strtok_r(cmd_copy, " ", &savestr);
    if(!token) return;
    /* 如果是开始执行程序 */
    if(strcmp(token, "start") == 0)
    {
        token = strtok_r(NULL, " ", &savestr);
        if(!token)
        {
            printf("Error! Usage: start <task_id>\n");
            return;
        }
        int task_id = atoi(token);
        if(task_id == 1)
        {
            token = strtok_r(NULL, " ", &savestr);
            if(token)
            {
                args[1] = strdup(token);
                if(!args[1])
                {
                    perror("strdup failed");
                    return;
                }
                printf("args[1](person_name) = %s\n", args[1]);
                start_task(task_id, args);
            }
            else
            {
                printf("[Error] Usage: start 1 <person_name>!\n");
            }
        }
        
        else if(task_id == 2 || task_id == 3)
        {
            char pid_str[16];
            parent_pid = getpid();
            snprintf(pid_str, sizeof(pid_str), "%d", parent_pid);
            args[1] = pid_str;
            /* 人脸识别程序要传入父进程pid,进行进程通信 */
            start_task(task_id, args);
        }
        else
        {
            start_task(task_id, args);
            printf("parse_command default process, task_id = %d\n", task_id);
        }
    }
    /* 如果是停止执行程序 */
    else if((strcmp(command, "stop") == 0) || strstr(command, "stop"))
    {
        stop_all_tasks();   //收到停止信号就停掉所有正在运行的程序
        
//根据id停止程序
#if 0 
        token = strtok_r(NULL, " ", &savestr);
        if(!token){
            printf("Error! Usage: stop <task_id>\n");
            return;
        }
        int task_id = atoi(token);
        stop_task(task_id);
#endif
    }
    else
    {
        printf("Unknown command:%s\n", command);
    }
}